#pragma once

#include <iostream>
#include <vector>
#include <utility>
#include <cmath>
#include <string>
#include <chrono>
#include <iomanip>

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
// typedef std::pair<float, float> PFF;

class BASEHACKREGION
{
public:
	BASEHACKREGION(std::vector<std::pair<int, int>>);
	BASEHACKREGION(int region[][2], int pointNums);
	BASEHACKREGION(std::vector<cv::Point> region);
	BASEHACKREGION();
	// cv::Mat maskRegion(cv::Mat image);
	bool detectHack(cv::Point targetPoint);					// 判断点是否在区域内
	void showRegion(cv::Mat &image);						// 画区域线并将区域显示在图像上
	void showRegion(cv::Mat &image, int width, int height); // 画区域线并将区域显示在图像上，并对显示窗口进行resize
	void drawRegion(cv::Mat &image);						// 画区域线，不显示在图像上
	bool sendflag;											// 是否发送报警信号
	long long region_start_alert_time;						// 区域发生alert时间
	bool region_last_squeeze_flag;							// 报警是否连续发生
	long long region_last_sendalret_time;					// 上次发送alert警报的时间
	std::vector<cv::Point> hack_region;						// 存储入侵区域线段点
private:
	long long Get_Current_Timestamp();																		  // 获取当前时间戳
	bool IsPointInPolygon(cv::Point targetPoint);															  // 判断点是否在多边形内(点在多边形的边上也算在内部)
	bool IsPointOnLine(float px0, float py0, float px1, float py1, float px2, float py2);					  // 判断点在线段上
	bool IsIntersect(float px1, float py1, float px2, float py2, float px3, float py3, float px4, float py4); // 判断两线段相交
};
